package com.xxx.common.result;

import lombok.Data;

import java.io.Serializable;

/**
 * 后端统一返回结果
 * 遵循HTTP状态码规范：
 * 200: 请求成功
 * 400: 客户端错误
 * 401: 未认证
 * 403: 无权限
 * 404: 资源不存在
 * 500: 服务器错误
 * @param <T> 数据类型
 */
@Data
public class Result<T> implements Serializable {

    private Integer code; // HTTP状态码
    private String msg; // 错误信息或成功消息
    private T data; // 数据

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 200; // 成功状态码
        result.msg = "Success";
        return result;
    }

    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 200; // 成功状态码
        result.msg = "Success";
        return result;
    }

    public static <T> Result<T> error(String msg) {
        return error(500, msg); // 默认服务器错误
    }

    public static <T> Result<T> error(Integer code, String msg) {
        Result<T> result = new Result<T>();
        result.code = code;
        result.msg = msg;
        return result;
    }

    /**
     * 400 错误 - 客户端请求错误
     * @param msg 错误信息
     * @return Result
     */
    public static <T> Result<T> badRequest(String msg) {
        return error(400, msg);
    }

    /**
     * 401 错误 - 未认证
     * @param msg 错误信息
     * @return Result
     */
    public static <T> Result<T> unauthorized(String msg) {
        return error(401, msg);
    }

    /**
     * 403 错误 - 无权限
     * @param msg 错误信息
     * @return Result
     */
    public static <T> Result<T> forbidden(String msg) {
        return error(403, msg);
    }

    /**
     * 404 错误 - 资源未找到
     * @param msg 错误信息
     * @return Result
     */
    public static <T> Result<T> notFound(String msg) {
        return error(404, msg);
    }

}
